package br.com.cast.UseCaseProdutos.notaFiscal.paginas;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.UseCaseProdutos.HomePage;
import br.com.cast.UseCaseProdutos.models.NotaFiscal;
import br.com.cast.UseCaseProdutos.models.Produto;
import br.com.cast.UseCaseProdutos.services.INotaFiscalService;
import br.com.cast.UseCaseProdutos.util.ComponentUtil;

public class ListarNotaFiscal extends Panel {

	private static final long serialVersionUID = 1L;

	@SpringBean
	private INotaFiscalService notaFiscalService;

	private CadastroNotaFiscal cadastroNotaFiscal;

	public ListarNotaFiscal(String id) {
		super(id);

		cadastroNotaFiscal = new CadastroNotaFiscal(HomePage.ID_CONTEUDO);

		criaLinkIncluir();

		DataView<NotaFiscal> dataView = criaDataView();

		criaPaginacao(dataView);
	}

	private void criaPaginacao(DataView<NotaFiscal> dataView) {
		add(new PagingNavigator("paginacao", dataView));
	}

	private DataView<NotaFiscal> criaDataView() {
		DataView<NotaFiscal> dataView = new DataView<NotaFiscal>(
				"notasFiscais", notaFiscalService) {
			private static final long serialVersionUID = 1L;

			@SuppressWarnings("rawtypes")
			@Override
			protected void populateItem(final Item<NotaFiscal> item) {

				if (item.getIndex() % 2 != 0) {
					// para linhas impares adiciona um estilo diferente.
					// o indice começa no zero
					item.add(AttributeModifier.replace("class", "alt"));
				}

				item.add(new Label("id"));
				
				item.add(new Label("numero"));

				NotaFiscal notaFiscal = item.getModelObject();
				item.add(new ListView<Produto>("produtosNF", notaFiscal
						.getProdutos()) {
					private static final long serialVersionUID = 1L;

					@Override
					protected void populateItem(ListItem<Produto> item) {
						Produto p = item.getModelObject();
						item.add(new Label("descricao", p.getDescricao()));
					}

				});

				item.add(new Label("valorNota"));
				
				item.add(new Link("alterar") {
					private static final long serialVersionUID = 1L;

					@Override
					public void onClick() {
						cadastroNotaFiscal.atualizaModel(item.getDefaultModelObject());
						redirecionaCadastro();
					}

				});

				item.add(new AjaxLink("excluir") {
					private static final long serialVersionUID = 1L;
					
					@Override
					public void onClick(AjaxRequestTarget target) {
						NotaFiscal notaFiscal = (NotaFiscal) item.getDefaultModelObject();
						notaFiscalService.excluir(notaFiscal);
						HomePage template = ComponentUtil.getTemplate(this);
						template.success("Registro excluído com sucesso!");
						
						target.add(template.get("msgErro"));
						target.add(template.get("msgSucesso"));
						target.add(template.get(HomePage.ID_CONTEUDO));
					}

				});

			}

		};

		dataView.setItemsPerPage(4);

		add(dataView);

		return dataView;
	}

	private void criaLinkIncluir() {
		add(new AjaxLink<Object>("incluir") {
			private static final long serialVersionUID = 1L;
			
			@Override
			public void onClick(AjaxRequestTarget target) {
				redirecionaCadastro();
				target.add(cadastroNotaFiscal);
			}
		});
	}

	private void redirecionaCadastro() {
		HomePage template = ComponentUtil.getTemplate(this);
		template.replace(cadastroNotaFiscal);
	}
}
